const user = require('./user.js')
const util = require('./util.js')

const viewUpdators = []

let currentIndex = -1
let status = ''
let numbers = []
const board = {
  number: 0,
  verifyDataResult: [],
  verifyResult: false,
  status: 'W'  // 记忆中：M，输入中：I，等待状态：W，其他状态：''
}

/**
 * 开始后，根据玩家等级创建以及记忆数列，并且开始进入记忆状态
 * 开始记忆时，每秒会更换当前显示的内容，直到所有数列显示完毕，显示结束后，进入输入状态
 */
const start = function() {
  _createNumbers(user.getLevel())
  board.status = 'M'  // 进入记忆状态
  _startCount()
  console.log(numbers)
}

const _createNumbers = function(userLevel) {
  for (let i = 0; i < userLevel; i++) {
    numbers.push(Math.floor(Math.random() * 10))
  }
}

const _startCount = function() {
  currentIndex++

  if (currentIndex < numbers.length) {
    board.number = numbers[currentIndex]
    setTimeout(_startCount, 1000)
  } else {
    board.status = 'I'  // 进入输入状态
  }

  _updateView()
}

/**
 * 将错误对比的结果放到board数据中，结果为一个数组，下标位置和正确的数字一一对应，正确为true，错误为false
 * 将对比最终结果放到board中的结构中
 * 验证完成后，进入结束状态
 */
const verify = function (value) {
  _verifyInput(value)
  _updateView()
}

const _verifyInput = function(value) {
  const verifyDataResult = []
  let hasError = false

  const len = numbers.length > value.length ? numbers.length : value.length  // 遍历正确数字和输入数字中较长的一个
  for (let i = 0; i < len; i++) {
    verifyDataResult[i] = {
      id: i,
      rightNumber: util.fixNull(numbers[i]),
      inputNumber: util.fixNull(value[i])
    }
    if (numbers[i] == value[i]) {
      verifyDataResult[i].verify = true
    } else {
      hasError = true
      verifyDataResult[i].verify = false
    }
  }

  /*
   * 根据是否成功，对回馈给user
   */
  if (hasError) {
    user.hitted() // 攻击玩家
  } else {
    user.reward() // 奖励玩家
  }

  board.verifyResult = !hasError  // 没有异常，就是正确
  board.verifyDataResult = verifyDataResult

  _reset()
}

const _reset = function() {
  board.status = 'W'  // 进入等待状态
  numbers = []
  currentIndex = -1 // 重新开始计数
}

const bindView = function (f) {
  f(board)
  viewUpdators.push(f)
}

const _updateView = function() {
  for (let i = 0; i < viewUpdators.length; i++) {
    viewUpdators[i](board)
  }
}

module.exports = { 
  start,
  verify,
  bindView 
}